package genedit.model;

import genedit.gui.GProjectTree;

import java.io.Serializable;
import java.util.UUID;

import javax.swing.SwingUtilities;
import javax.swing.tree.TreeNode;

/**
 * Abstraktna klasa koju mora naslediti svaki element hijerarhije izuzev
 * elemenata dijagrama. Implementira Serializable i TreeNode interfejs, i nudi
 * nekoliko metoda za polimofrnu upotrebu nad čvorovima stabla.
 * 
 * @author Nikola
 * @version 1.2 18/12/13
 */
public abstract class HierarchyElement implements TreeNode, Serializable {

	private static final long serialVersionUID = 1L;

	/**
	 * Jedinstveni identifikator za svaki element hijerarhije.
	 */
	private transient HierarchyObservable observable = new HierarchyObservable();

	private UUID id;

	public UUID getId() {
		return id;
	}

	public HierarchyElement() {
		id = UUID.randomUUID();
	}

	/**
	 * Metoda koju svaki element hijerarhije treba da nadglasi. Uklanja element
	 * hijerarhije koji se nalazi u njegovoj kolekciji. Metoda uvedena zbog
	 * polimorfne upotrebe ove funkcionalnosti.
	 * 
	 * @param he
	 *            element koji će se ukloniti.
	 */
	public void removeChild(HierarchyElement he) {
		SwingUtilities.updateComponentTreeUI(GProjectTree.getInstance().getTree());
	}

	/**
	 * Metoda za preimenovanje elementa hijerarhije. Postavljena u nadklasu zbog
	 * polimorfne upotrebe.
	 * 
	 * @param name
	 *            novo ime izabranog elementa hijerarhije
	 */
	public abstract void rename(String name);

	/** @param isCut */
	public abstract boolean isSaved();// Potencijalno će se ukloniti.

	public abstract void setSaved(boolean saved);

	public HierarchyObservable getObservable() {
		if (observable == null)
			observable = new HierarchyObservable();
		return observable;
	}

	public void setObservable(HierarchyObservable observable) {
		this.observable = observable;
	}
}